S3バケットのクロスアカウントレプリケーションを試してみた
データアナリティクス事業本部の笠原です。
今回はS3バケットのクロスアカウントレプリケーションを行なったので、設定方法をまとめてみました。
3行まとめ
- 送信元、送信先バケットとも、S3バージョニングを有効化する
- 送信元のバケットレプリケーションルールを設定する
- 送信元のバケットレプリケーション実行IAMロールに対して、送信先のバケットポリシーにて適切な権限設定をする
バケット作成
送信元バケット、送信先バケットを事前に作成しておきます。
- 同一リージョン (今回はap-northeast-1) で作成
- バージョニング有効化
- パブリックアクセスブロック有効化
送信元バケットのレプリケーション設定
送信元バケットの「管理」⇒「レプリケーションルール」から、レプリケーションルールを作成します。今回はこんな感じの設定です。
- レプリケーションルール名:
replication1
- ステータス: 有効
- ソースバケット
- ルールスコープを選択: バケット内の全てのオブジェクトに適用
- 送信先
- 別のアカウントのバケットを指定する
- 「アカウントID」と「送信先バケット名」を指定
- 「オブジェクト所有者を送信先バケット所有者に変更」にチェックを入れる
- 別のアカウントのバケットを指定する
- IAMロール
- 既存のロールから選択: 新しいロールの作成
- 暗号化
- 今回はデフォルトのチェックなしのままにします
- KMS暗号化されたオブジェクトをレプリケートする場合はチェックを入れておきましょう
- 今回はデフォルトのチェックなしのままにします
- 送信先ストレージクラス
- 今回はデフォルトのチェックなしのままにします
- 追加のレプリケーションオプション
- 今回は以下のオプションにチェック入れました
- 「レプリケーション時間のコントロール (RTC)」にチェックを入れる
- 今回は以下のオプションにチェック入れました
ルールを保存すると、既存オブジェクトをレプリケートするか尋ねられます。 今回はまだバケットにオブジェクトが何もないので、「いいえ、既存オブジェクトをレプリケートしません」を選択しておきます。
ルールを保存すると、レプリケーション用にIAMロールが作成されています。ポリシーはこんな感じでした。なお、IAMロールのARNをメモしておきましょう。この後、送信先バケットポリシーの設定で必要になります。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:ListBucket", "s3:GetReplicationConfiguration", "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging", "s3:GetObjectRetention", "s3:GetObjectLegalHold" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::<送信元バケット>", "arn:aws:s3:::<送信元バケット>/*", "arn:aws:s3:::<送信先バケット>", "arn:aws:s3:::<送信先バケット>/*" ] }, { "Action": [ "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ReplicateTags", "s3:ObjectOwnerOverrideToBucketOwner" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::<送信元バケット>/*", "arn:aws:s3:::<送信先バケット>/*" ] } ] }
送信先バケットのバケットポリシー設定
送信元バケットにてレプリケーション設定したら、以下のように送信先バケットにバケットポリシーを設定しておきましょう。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<送信元アカウントID>:role/service-role/<送信元IAMロール>" }, "Action": [ "s3:ReplicateDelete", "s3:ReplicateObject", "s3:ReplicateTags", "s3:ObjectOwnerOverrideToBucketOwner" ], "Resource": "arn:aws:s3:::<送信先バケット>/*" } ] }
動作確認
送信元バケットにファイルをアップロードします。しばらくすると、送信先バケットにファイルがレプリケートされていればOKです。
アップロード後レプリケートがなかなかされない場合は、送信元バケットのオブジェクトプロパティ内にあるレプリケーションステータスを確認しましょう。PENDINGならまだレプリケーションされる前の状態になりますし、FAILEDならレプリケーション失敗となります。設定内容を確認しましょう。
KMSを利用している場合は、送信元IAMロールがKMSキーにアクセスできていないケースがあるので、ロールのポリシー含め権限設定を見直してみましょう。